import { onErrorCaptured } from 'vue'

// 1. 错误格式化：统一错误格式（提示+堆栈+来源+时间）
function formatError(error, source = '未知') {
  return {
    message: error.message || '未知错误',
    stack: error.stack || '无堆栈',
    source,
    time: new Date().toISOString()
  }
}

// 3. 组件内使用：一键捕获组件错误（Vue3组合式函数）
function useErrorHandler(componentName, preventPropagation = false) {
  onErrorCaptured((error, _, info) => {
    const errorInfo = formatError(error, `组件[${componentName}]`)
    import.meta.env.DEV && console.error(errorInfo) // 开发时打印
    // 在Vue 3中，onErrorCaptured返回true表示阻止错误继续传播到父组件或全局
    // 返回false表示允许错误向上传播
    return preventPropagation;
  })
}

// 4. 全局配置：捕获全局+未处理Promise错误（main.js中用）
function setupGlobalErrorHandler(app) {
  // 全局错误（如路由守卫、全局指令）
  app.config.errorHandler = (error, _, info) => {
    const errorInfo = formatError(error, `全局[${info}]`)
    console.error(errorInfo)
  }

  // 接口请求没写catch()的错误
  window.addEventListener('unhandledrejection', (event) => {
    const errorInfo = formatError(event.reason, '未处理Promise')
    console.error(errorInfo)
  })
}

// 导出核心方法（只留常用的）
export default {
  use: useErrorHandler, // 组件内用
  setupGlobal: setupGlobalErrorHandler // 全局用
}